#include "./loopLinkList.h"

// 创建函数
LinkList CreateLoopLinkList()
{
    // 创建一个单向循环链表
    LinkList L = (LinkList)malloc(sizeof(LNode));
    L->next = L; // 循环链表头结点指向自己
    L->data = 0; // 头结点初始化为0
    return L;
}
// 获取链表长度函数
int GetLength(LinkList L)
{
    LinkList head = L->next;
    int i = 0;
    while (head != L)
    {
        head = head->next;
        i++;
    }
    return i;
}
// 获取指定位置函数
LinkList ListGet(LinkList L, int pos)
{
    if (L == NULL)
    {
        printf("链表为空\n");
        return NULL;
    }
    if (pos < 0)
    {
        printf("位置错误\n");
    }
    if (pos > GetLength(L))
    {
        printf("位置大于链表长度\n");
    }
    LinkList head = L;
    int i = 0;
    while (head->next != L)
    {
        if (pos == i)
        {
            return head;
        }
        head = head->next;
        i++;
    }
}

// 插入函数
int ListInsert(LinkList L, int pos, Data_type value)
{
    if (L == NULL)
    {
        printf("链表为空\n");
        return -1;
    }
    if (pos < 0)
    {
        printf("位置错误\n");
    }
    if (pos > GetLength(L))
    {
        printf("位置大于链表长度\n");
    }
    LinkList head = L;
    LinkList newNode = (LinkList)malloc(sizeof(LNode));
    if (newNode == NULL)
    {
        printf("内存分配失败\n");
    }
    LinkList posNodeNext = ListGet(L, pos - 1);
    newNode->data = value;
    newNode->next = posNodeNext->next;
    posNodeNext->next = newNode;
}

// 销毁函数
void ListDestroy(LinkList L)
{
    LinkList head = L->next;
    while (head != L)
    {
        LinkList q = head;
        head = head->next;
        free(q);
    }
    free(L);
    L = NULL;
}

// 删除指定位置节点函数
int ListDelete(LinkList L, int pos)
{
    LinkList head = L;
    if (L == NULL)
    {
        printf("链表为空\n");
        return -1;
    }
    if (pos < 0)
    {
        printf("位置错误\n");
        return -1;
    }
    if (pos > GetLength(L))
    {
        printf("位置大于链表长度\n");
        return -1;
    }
    int i = 0;
    while (head->next != L)
    {
        if (pos == i)
        {
            printf("~%d \n", head->next->data);
            // 备份当前节点的下一个节点作为要删除的节点
            LinkList q = head->next;
            printf("~%d \n", q->data);
            // 将当前的head节点指向要删除节点的下一个节点
            head->next = q->next;
            // 删除节点
            free(q);
            return 0;
        }
        head = head->next;
        i++;
    }
}

// 头插函数
void HeadInsertLoopLinkList(LinkList L, Data_type value)
{
    LinkList head = L;
    // 给新节点分配内存空间
    LinkList newNode = (LinkList)malloc(sizeof(LNode));
    // 赋值
    newNode->data = value;
    // 将新节点插入到头结点之后
    newNode->next = head->next;
    head->next = newNode;
}
// 尾部插入函数
int TailInsertLoopLinkList(LinkList L, Data_type value)
{
    if (L == NULL)
    {
        printf("链表为空\n");
        return -1;
    }

    LinkList head = L;
    // 给新节点分配内存空间
    LinkList newNode = (LinkList)malloc(sizeof(LNode));
    if (newNode == NULL)
    {
        printf("内存分配失败\n");
        return -1;
    }
    // 赋值
    newNode->data = value;
    // 找到尾结点
    while (head->next != L)
    {
        head = head->next;
    }
    head->next = newNode;
    newNode->next = L;
    return 0;
}
// 打印函数
int PrintLoopLinkList(LinkList L)
{
    if (L == NULL)
    {
        printf("链表为空\n");
        return -1;
    }

    LinkList p = L->next;
    while (p != L)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
    return 0;
}
// 删除
void DeleteLoopLinkList(LinkList L, int n)
{
    LinkList p = L->next;
    while (p != L)
    {
        LinkList q = p->next;
        free(p);
        p = q;
    }
}
void main()
{
    LinkList H = CreateLoopLinkList();
    HeadInsertLoopLinkList(H, 1);
    HeadInsertLoopLinkList(H, 2);
    HeadInsertLoopLinkList(H, 3);
    HeadInsertLoopLinkList(H, 4);
    HeadInsertLoopLinkList(H, 5);
    TailInsertLoopLinkList(H, 7);
    TailInsertLoopLinkList(H, 8);
    TailInsertLoopLinkList(H, 9);
    TailInsertLoopLinkList(H, 10);
    PrintLoopLinkList(H);
    LinkList value = ListGet(H, 2);
    printf("%d", value->data);
    printf("\n");
    ListInsert(H, 6, 66);
    PrintLoopLinkList(H);
    ListDelete(H, 0);
    PrintLoopLinkList(H);
    ListDestroy(H);
    PrintLoopLinkList(H);
}
